/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fr.univnantes.alma.arbres.affichage;

import fr.univnantes.alma.arbres.Arbre;
import fr.univnantes.alma.arbres.Noeud;

/**
 * Permet l'affichage d'un arbre au format pstree du package LaTeX pstricks
 * @author judu
 */
public class AffichagePSTree<T> {
    
    private Arbre<T> arbre1;

    public AffichagePSTree(Arbre<T> arbre1) {
        this.arbre1 = arbre1;
    }


    @Override
    public String toString() {
        return this.print(this.arbre1.getRacine());
    }
    /**
     * Retourne le pstree issu de n.
     * @param n nœud « racine »
     * @return l'arborescence représentée par le nœud et sa descendance.
     */
    private String print(Noeud<T> n) {
        String sortie = new String();
        if(n == null){
            return "";
        }

        //On a un nœud sans valeur, on crée juste le cercle avec l'étiquette dedans
        Noeud<T> fils = this.arbre1.getFirstFils(n);
        if(fils == null){
            if(n.getValeur() == null){
                // Si pas de fils, on renvoie juste un cercle avec l'étiquette.
                return ("\\Toval{("+n.getPosition()+") "+n.getEtiquette()+"}\n");
            } else {
                return ("\\Toval{\\begin{tabular}{l}\n("+n.getPosition()+") "+n.getEtiquette()+"\\\\ "+n.getValeur().toString()+"\\end{tabular}}\n");
            }
        } else {
            // Si des fils, on retourne un pstree
            if(n.getValeur() == null){
                // Si pas de fils, on renvoie juste un cercle avec l'étiquette.
                sortie = sortie.concat("\\pstree{\\Toval{("+n.getPosition()+")"+n.getEtiquette()+"}}{\n");
            } else {
                sortie = sortie.concat("\\pstree{\\Toval{\\begin{tabular}{l}\n("+n.getPosition()+") "+n.getEtiquette()+"\\\\ "+n.getValeur().toString()+"\\end{tabular}}{\n");
            }

            while(this.arbre1.hasNextFrere(fils)){
                sortie = sortie.concat(this.print(fils)+"\n");
                fils = this.arbre1.getNextFrere(fils);
            }
            sortie = sortie.concat(this.print(fils)+"\n");
            fils = this.arbre1.getNextFrere(fils);

            sortie = sortie.concat("}\n");
            return sortie;
        }
    }
}
